package com.ilongsay.shiro;

import org.apache.shiro.session.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @Author ilongsay
 * @Email ilongsay@163.com
 * @Copyright 版本所有，侵权必究！
 * @Description 这里是redis的增删改查，为session定制版本的增删改查！
 * redisTemplate支持的是JDK的序列化，StringredisTemplate支持的是String的序列化，2者数据不通用
 * @Create 2018-08-14 14:06
 */
@Component
public class RedisSessionDao {

	@Autowired
	private RedisTemplate<String,Session> redisTemplate;

	//这里的这个KEY是指的是数据库，比如redis的1号数据库下面有多个key数据库，数据库下面有多个key！
	private static final String KEY = "shareSessionMap";
	//这里是设置session的过期时间，默认设置保留为10天！这里以后还需要做修改，将数据存放在属性配置文件中
	private int SENCONDS = 2592000;
	/**
	 *@author ilongsay
	 *@Createtime 2018-08-17 14:18
	 *@Description 这里是增加byte
	  * @param sessionId
	 * @param bytes
	 *@return void
	 */
	public void hadd(String sessionId, byte[] bytes){
		redisTemplate.boundHashOps(KEY).put(sessionId, bytes);
		redisTemplate.expire(KEY,SENCONDS, TimeUnit.SECONDS);
	}
	/**
	 *@author ilongsay
	 *@Createtime 2018-08-17 14:18
	 *@Description 增加session的值
	  * @param sessionId
	 * @param session
	 *@return void
	 */
	public void hadd(String sessionId, Session session){
		redisTemplate.boundHashOps(KEY).put(sessionId, session);
		redisTemplate.expire(KEY,SENCONDS, TimeUnit.SECONDS);
	}

	/**
	 *@author ilongsay
	 *@Createtime 2018-08-17 14:18
	 *@Description 删除session的值
	  * @param sessionId
	 *@return void
	 */
	public void hdelete(String sessionId){
		redisTemplate.boundHashOps(KEY).delete(sessionId);
	}

	/**
	 *@author ilongsay
	 *@Createtime 2018-08-17 14:17
	 *@Description 得到session的值
	  * @param sessionId
	 *@return org.apache.shiro.session.Session
	 */
	public Session hget(String sessionId){
		redisTemplate.expire(KEY,SENCONDS, TimeUnit.SECONDS);
		return (Session) redisTemplate.boundHashOps(KEY).get(sessionId);
	}

	/**
	 *@author ilongsay
	 *@Createtime 2018-08-17 17:19
	 *@Description 获取session不设置过期时间
	  * @param sessionId
	 *@return org.apache.shiro.session.Session
	 */
	public Session hgetWithoutExpire(String sessionId){
		return (Session) redisTemplate.boundHashOps(KEY).get(sessionId);
	}
	/**
	 *@author ilongsay
	 *@Createtime 2018-08-17 14:14
	 *@Description 这里只是测试的版本，存byte值取的也是byte值
	  * @param sessionId
	 *@return byte[]
	 */
	public byte[] hget1(String sessionId){
		redisTemplate.expire(KEY,SENCONDS, TimeUnit.SECONDS);
		return (byte[]) redisTemplate.boundHashOps(KEY).get(sessionId);
	}

	/**
	 *@author ilongsay
	 *@Createtime 2018-08-17 14:17
	 *@Description 取出所有的session，是为了统计在线人数，不用设置时间
	  * @param
	 *@return java.util.List<org.apache.shiro.session.Session>
	 */
	public List<Session> hmget(){
		List<Session> list = new ArrayList<Session>();

		List<Object> values = redisTemplate.boundHashOps(KEY).values();
		for (Object object : values) {
			list.add((Session) object);
		}
		return list;
	}
}
